{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Execute this cell to install dependencies\n",
    "%pip install sf-hamilton[visualization]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Pandas materialization [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/dagworks-inc/hamilton/blob/main/examples/pandas/materialization/notebook.ipynb) [![GitHub badge](https://img.shields.io/badge/github-view_source-2b3137?logo=github)](https://github.com/apache/hamilton/blob/main/examples/pandas/materialization/notebook.ipynb)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-09-17T05:43:33.890006Z",
     "start_time": "2023-09-17T05:43:33.866292Z"
    }
   },
   "outputs": [],
   "source": [
    "import sqlite3\n",
    "import sys\n",
    "import pandas as pd\n",
    "\n",
    "# Add the hamilton module to your path - optional\n",
    "# project_dir = \"### ADD PATH HERE ###\"\n",
    "# sys.path.append(project_dir)\n",
    "\n",
    "from hamilton import base, driver\n",
    "from hamilton.io.materialization import to"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-09-17T05:43:33.890336Z",
     "start_time": "2023-09-17T05:43:33.869093Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# We use the autoreload extension that comes with ipython to automatically reload modules when\n",
    "# the code in them changes.\n",
    "\n",
    "# import the jupyter extension\n",
    "%load_ext autoreload\n",
    "# set it to only reload the modules imported\n",
    "%autoreload 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-09-17T05:43:33.930823Z",
     "start_time": "2023-09-17T05:43:33.875941Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Overwriting spend_calculations.py\n"
     ]
    }
   ],
   "source": [
    "%%writefile spend_calculations.py\n",
    "# Define your new Hamilton functions.\n",
    "# The %%writefile magic command creates a new Python module with the functions below.\n",
    "# We will import this later and pass it into our Driver.\n",
    "\n",
    "import pandas as pd\n",
    " \n",
    "# Look at `my_functions` to see how these functions connect.\n",
    "def avg_3wk_spend(spend: pd.Series) -> pd.Series:\n",
    "    \"\"\"Rolling 3 week average spend.\"\"\"\n",
    "    return spend.rolling(3).mean()\n",
    "\n",
    "\n",
    "def spend_per_signup(spend: pd.Series, signups: pd.Series) -> pd.Series:\n",
    "    \"\"\"The cost per signup in relation to spend.\"\"\"\n",
    "    return spend / signups\n",
    "\n",
    "\n",
    "def spend_mean(spend: pd.Series) -> float:\n",
    "    \"\"\"Shows function creating a scalar. In this case it computes the mean of the entire column.\"\"\"\n",
    "    return spend.mean()\n",
    "\n",
    "\n",
    "def spend_zero_mean(spend: pd.Series, spend_mean: float) -> pd.Series:\n",
    "    \"\"\"Shows function that takes a scalar. In this case to zero mean spend.\"\"\"\n",
    "    return spend - spend_mean\n",
    "\n",
    "\n",
    "def spend_std_dev(spend: pd.Series) -> float:\n",
    "    \"\"\"Function that computes the standard deviation of the spend column.\"\"\"\n",
    "    return spend.std()\n",
    "\n",
    "\n",
    "def spend_zero_mean_unit_variance(spend_zero_mean: pd.Series, spend_std_dev: float) -> pd.Series:\n",
    "    \"\"\"Function showing one way to make spend have zero mean and unit variance.\"\"\"\n",
    "    return spend_zero_mean / spend_std_dev"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-09-17T05:43:33.931096Z",
     "start_time": "2023-09-17T05:43:33.881858Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "initial_columns = {  # load from actuals or wherever -- this is our initial data we use as input.\n",
    "    # Note: these values don't have to be all series, they could be a scalar.\n",
    "    \"signups\": pd.Series([1, 10, 50, 100, 200, 400]),\n",
    "    \"spend\": pd.Series([10, 10, 20, 40, 40, 50]),\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-09-17T05:43:33.932468Z",
     "start_time": "2023-09-17T05:43:33.887774Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "%aimport spend_calculations\n",
    "\n",
    "df_builder = base.PandasDataFrameResult()\n",
    "dr = driver.Driver({}, spend_calculations)  # can pass in multiple modules"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-09-17T05:43:33.932900Z",
     "start_time": "2023-09-17T05:43:33.892681Z"
    }
   },
   "outputs": [],
   "source": [
    "# we need to specify what we want in the final dataframe. These can be string names, or function references.\n",
    "output_columns = [\n",
    "    \"spend\",\n",
    "    \"signups\",\n",
    "    \"avg_3wk_spend\",\n",
    "    \"spend_per_signup\",\n",
    "    \"spend_zero_mean_unit_variance\",\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-09-17T05:43:33.933121Z",
     "start_time": "2023-09-17T05:43:33.896779Z"
    }
   },
   "outputs": [],
   "source": [
    "# set up db connection for sql materializer below\n",
    "conn = sqlite3.connect(\"df.db\")\n",
    "\n",
    "# remove an previous instances of the 'test' table that will be created next\n",
    "conn.cursor().execute(\"DROP TABLE IF EXISTS test;\")\n",
    "conn.commit()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-09-17T05:43:34.014270Z",
     "start_time": "2023-09-17T05:43:33.912979Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "More than one applicable adapter detected for <class 'pandas.core.frame.DataFrame'>. Using the last one registered <class 'hamilton.plugins.pandas_extensions.PandasPickleWriter'>.\n"
     ]
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 9.0.0 (20230911.1827)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"1102pt\" height=\"1160pt\"\n",
       " viewBox=\"0.00 0.00 1101.85 1159.60\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 1155.6)\">\n",
       "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-1155.6 1097.85,-1155.6 1097.85,4 -4,4\"/>\n",
       "<g id=\"clust1\" class=\"cluster\">\n",
       "<title>cluster__legend</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" points=\"8,-573.8 8,-817.8 116.1,-817.8 116.1,-573.8 8,-573.8\"/>\n",
       "<text text-anchor=\"middle\" x=\"62.05\" y=\"-800.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Legend</text>\n",
       "</g>\n",
       "<!-- spend_std_dev -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>spend_std_dev</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M403.92,-649.6C403.92,-649.6 308.07,-649.6 308.07,-649.6 302.07,-649.6 296.07,-643.6 296.07,-637.6 296.07,-637.6 296.07,-598 296.07,-598 296.07,-592 302.07,-586 308.07,-586 308.07,-586 403.92,-586 403.92,-586 409.92,-586 415.92,-592 415.92,-598 415.92,-598 415.92,-637.6 415.92,-637.6 415.92,-643.6 409.92,-649.6 403.92,-649.6\"/>\n",
       "<text text-anchor=\"start\" x=\"306.87\" y=\"-626.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">spend_std_dev</text>\n",
       "<text text-anchor=\"start\" x=\"343.25\" y=\"-598.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">float</text>\n",
       "</g>\n",
       "<!-- spend_zero_mean_unit_variance -->\n",
       "<g id=\"node11\" class=\"node\">\n",
       "<title>spend_zero_mean_unit_variance</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M677.65,-649.6C677.65,-649.6 467.05,-649.6 467.05,-649.6 461.05,-649.6 455.05,-643.6 455.05,-637.6 455.05,-637.6 455.05,-598 455.05,-598 455.05,-592 461.05,-586 467.05,-586 467.05,-586 677.65,-586 677.65,-586 683.65,-586 689.65,-592 689.65,-598 689.65,-598 689.65,-637.6 689.65,-637.6 689.65,-643.6 683.65,-649.6 677.65,-649.6\"/>\n",
       "<text text-anchor=\"start\" x=\"465.85\" y=\"-626.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">spend_zero_mean_unit_variance</text>\n",
       "<text text-anchor=\"start\" x=\"553.22\" y=\"-598.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- spend_std_dev&#45;&gt;spend_zero_mean_unit_variance -->\n",
       "<g id=\"edge24\" class=\"edge\">\n",
       "<title>spend_std_dev&#45;&gt;spend_zero_mean_unit_variance</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M416.42,-617.8C424.97,-617.8 434.02,-617.8 443.29,-617.8\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"443.17,-621.3 453.17,-617.8 443.17,-614.3 443.17,-621.3\"/>\n",
       "</g>\n",
       "<!-- df_to_sql_build_result -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>df_to_sql_build_result</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M887.25,-1017.6C887.25,-1017.6 745.65,-1017.6 745.65,-1017.6 739.65,-1017.6 733.65,-1011.6 733.65,-1005.6 733.65,-1005.6 733.65,-966 733.65,-966 733.65,-960 739.65,-954 745.65,-954 745.65,-954 887.25,-954 887.25,-954 893.25,-954 899.25,-960 899.25,-966 899.25,-966 899.25,-1005.6 899.25,-1005.6 899.25,-1011.6 893.25,-1017.6 887.25,-1017.6\"/>\n",
       "<text text-anchor=\"start\" x=\"744.45\" y=\"-994.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_sql_build_result</text>\n",
       "<text text-anchor=\"start\" x=\"782.32\" y=\"-966.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- df_to_sql -->\n",
       "<g id=\"node21\" class=\"node\">\n",
       "<title>df_to_sql</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M1079.97,-1136.58C1079.97,-1140.96 1052.44,-1144.52 1018.55,-1144.52 984.66,-1144.52 957.12,-1140.96 957.12,-1136.58 957.12,-1136.58 957.12,-1065.02 957.12,-1065.02 957.12,-1060.64 984.66,-1057.08 1018.55,-1057.08 1052.44,-1057.08 1079.97,-1060.64 1079.97,-1065.02 1079.97,-1065.02 1079.97,-1136.58 1079.97,-1136.58\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1079.97,-1136.58C1079.97,-1132.19 1052.44,-1128.63 1018.55,-1128.63 984.66,-1128.63 957.12,-1132.19 957.12,-1136.58\"/>\n",
       "<text text-anchor=\"start\" x=\"988.55\" y=\"-1109.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_sql</text>\n",
       "<text text-anchor=\"start\" x=\"967.92\" y=\"-1081.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">PandasSqlWriter</text>\n",
       "</g>\n",
       "<!-- df_to_sql_build_result&#45;&gt;df_to_sql -->\n",
       "<g id=\"edge43\" class=\"edge\">\n",
       "<title>df_to_sql_build_result&#45;&gt;df_to_sql</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M873.46,-1017.99C896.22,-1031.07 922.78,-1046.33 946.85,-1060.17\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"944.92,-1063.1 955.34,-1065.04 948.41,-1057.03 944.92,-1063.1\"/>\n",
       "</g>\n",
       "<!-- df_to_json -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>df_to_json</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M1084.47,-1031.58C1084.47,-1035.96 1054.93,-1039.52 1018.55,-1039.52 982.17,-1039.52 952.62,-1035.96 952.62,-1031.58 952.62,-1031.58 952.62,-960.02 952.62,-960.02 952.62,-955.64 982.17,-952.07 1018.55,-952.07 1054.93,-952.07 1084.47,-955.64 1084.47,-960.02 1084.47,-960.02 1084.47,-1031.58 1084.47,-1031.58\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1084.47,-1031.58C1084.47,-1027.19 1054.93,-1023.63 1018.55,-1023.63 982.17,-1023.63 952.62,-1027.19 952.62,-1031.58\"/>\n",
       "<text text-anchor=\"start\" x=\"984.42\" y=\"-1004.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_json</text>\n",
       "<text text-anchor=\"start\" x=\"963.42\" y=\"-976.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">PandasJsonWriter</text>\n",
       "</g>\n",
       "<!-- df_to_pickle -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>df_to_pickle</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M1088.22,-821.57C1088.22,-825.96 1057,-829.52 1018.55,-829.52 980.1,-829.52 948.88,-825.96 948.88,-821.57 948.88,-821.57 948.88,-750.02 948.88,-750.02 948.88,-745.64 980.1,-742.07 1018.55,-742.07 1057,-742.07 1088.22,-745.64 1088.22,-750.02 1088.22,-750.02 1088.22,-821.57 1088.22,-821.57\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1088.22,-821.57C1088.22,-817.19 1057,-813.62 1018.55,-813.62 980.1,-813.62 948.88,-817.19 948.88,-821.57\"/>\n",
       "<text text-anchor=\"start\" x=\"979.17\" y=\"-794.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_pickle</text>\n",
       "<text text-anchor=\"start\" x=\"959.67\" y=\"-766.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">PandasPickleWriter</text>\n",
       "</g>\n",
       "<!-- df_to_xml -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>df_to_xml</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M1082.22,-611.57C1082.22,-615.96 1053.68,-619.52 1018.55,-619.52 983.42,-619.52 954.88,-615.96 954.88,-611.57 954.88,-611.57 954.88,-540.02 954.88,-540.02 954.88,-535.64 983.42,-532.07 1018.55,-532.07 1053.68,-532.07 1082.22,-535.64 1082.22,-540.02 1082.22,-540.02 1082.22,-611.57 1082.22,-611.57\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1082.22,-611.57C1082.22,-607.19 1053.68,-603.62 1018.55,-603.62 983.42,-603.62 954.88,-607.19 954.88,-611.57\"/>\n",
       "<text text-anchor=\"start\" x=\"986.3\" y=\"-584.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_xml</text>\n",
       "<text text-anchor=\"start\" x=\"965.67\" y=\"-556.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">PandasXmlWriter</text>\n",
       "</g>\n",
       "<!-- df_to_stata -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>df_to_stata</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M1085.97,-926.57C1085.97,-930.96 1055.75,-934.52 1018.55,-934.52 981.35,-934.52 951.12,-930.96 951.12,-926.57 951.12,-926.57 951.12,-855.02 951.12,-855.02 951.12,-850.64 981.35,-847.07 1018.55,-847.07 1055.75,-847.07 1085.97,-850.64 1085.97,-855.02 1085.97,-855.02 1085.97,-926.57 1085.97,-926.57\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1085.97,-926.57C1085.97,-922.19 1055.75,-918.62 1018.55,-918.62 981.35,-918.62 951.12,-922.19 951.12,-926.57\"/>\n",
       "<text text-anchor=\"start\" x=\"982.55\" y=\"-899.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_stata</text>\n",
       "<text text-anchor=\"start\" x=\"961.92\" y=\"-871.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">PandasStataWriter</text>\n",
       "</g>\n",
       "<!-- df_to_json_build_result -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>df_to_json_build_result</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M891.37,-935.6C891.37,-935.6 741.52,-935.6 741.52,-935.6 735.52,-935.6 729.52,-929.6 729.52,-923.6 729.52,-923.6 729.52,-884 729.52,-884 729.52,-878 735.52,-872 741.52,-872 741.52,-872 891.37,-872 891.37,-872 897.37,-872 903.37,-878 903.37,-884 903.37,-884 903.37,-923.6 903.37,-923.6 903.37,-929.6 897.37,-935.6 891.37,-935.6\"/>\n",
       "<text text-anchor=\"start\" x=\"740.32\" y=\"-912.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_json_build_result</text>\n",
       "<text text-anchor=\"start\" x=\"782.32\" y=\"-884.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- df_to_json_build_result&#45;&gt;df_to_json -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>df_to_json_build_result&#45;&gt;df_to_json</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M894.77,-936.07C901.38,-938.98 907.94,-941.91 914.25,-944.8 923.33,-948.96 932.8,-953.44 942.16,-957.95\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"940.36,-960.97 950.89,-962.19 943.42,-954.67 940.36,-960.97\"/>\n",
       "</g>\n",
       "<!-- df_to_stata_build_result -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>df_to_stata_build_result</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M893.25,-853.6C893.25,-853.6 739.65,-853.6 739.65,-853.6 733.65,-853.6 727.65,-847.6 727.65,-841.6 727.65,-841.6 727.65,-802 727.65,-802 727.65,-796 733.65,-790 739.65,-790 739.65,-790 893.25,-790 893.25,-790 899.25,-790 905.25,-796 905.25,-802 905.25,-802 905.25,-841.6 905.25,-841.6 905.25,-847.6 899.25,-853.6 893.25,-853.6\"/>\n",
       "<text text-anchor=\"start\" x=\"738.45\" y=\"-830.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_stata_build_result</text>\n",
       "<text text-anchor=\"start\" x=\"782.32\" y=\"-802.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- df_to_stata_build_result&#45;&gt;df_to_stata -->\n",
       "<g id=\"edge9\" class=\"edge\">\n",
       "<title>df_to_stata_build_result&#45;&gt;df_to_stata</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M905.51,-852.16C917.03,-856.14 928.77,-860.18 940.1,-864.09\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"938.79,-867.34 949.38,-867.29 941.07,-860.72 938.79,-867.34\"/>\n",
       "</g>\n",
       "<!-- spend_per_signup -->\n",
       "<g id=\"node9\" class=\"node\">\n",
       "<title>spend_per_signup</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M631.15,-731.6C631.15,-731.6 513.55,-731.6 513.55,-731.6 507.55,-731.6 501.55,-725.6 501.55,-719.6 501.55,-719.6 501.55,-680 501.55,-680 501.55,-674 507.55,-668 513.55,-668 513.55,-668 631.15,-668 631.15,-668 637.15,-668 643.15,-674 643.15,-680 643.15,-680 643.15,-719.6 643.15,-719.6 643.15,-725.6 637.15,-731.6 631.15,-731.6\"/>\n",
       "<text text-anchor=\"start\" x=\"512.35\" y=\"-708.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">spend_per_signup</text>\n",
       "<text text-anchor=\"start\" x=\"553.22\" y=\"-680.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- spend_per_signup&#45;&gt;df_to_sql_build_result -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>spend_per_signup&#45;&gt;df_to_sql_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M643.35,-711.08C660.83,-717.15 677.91,-726.48 689.65,-740.8 747.7,-811.63 662.81,-872.21 718.65,-944.8 720.45,-947.14 722.41,-949.35 724.5,-951.44\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"722.15,-954.03 732.02,-957.89 726.71,-948.72 722.15,-954.03\"/>\n",
       "</g>\n",
       "<!-- spend_per_signup&#45;&gt;df_to_json_build_result -->\n",
       "<g id=\"edge11\" class=\"edge\">\n",
       "<title>spend_per_signup&#45;&gt;df_to_json_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M643.41,-712.13C660.57,-718.21 677.48,-727.27 689.65,-740.8 726.93,-782.23 682.67,-820.24 718.65,-862.8 719.45,-863.74 720.27,-864.66 721.11,-865.56\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"718.45,-867.87 728.18,-872.08 723.2,-862.73 718.45,-867.87\"/>\n",
       "</g>\n",
       "<!-- spend_per_signup&#45;&gt;df_to_stata_build_result -->\n",
       "<g id=\"edge15\" class=\"edge\">\n",
       "<title>spend_per_signup&#45;&gt;df_to_stata_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M643.52,-716.88C659.63,-722.81 676.01,-730.62 689.65,-740.8 707.25,-753.93 701.47,-767.13 718.65,-780.8 719.77,-781.69 720.92,-782.57 722.09,-783.44\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"719.89,-786.17 730.13,-788.89 723.82,-780.38 719.89,-786.17\"/>\n",
       "</g>\n",
       "<!-- df_to_pickle_build_result -->\n",
       "<g id=\"node10\" class=\"node\">\n",
       "<title>df_to_pickle_build_result</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M896.62,-771.6C896.62,-771.6 736.27,-771.6 736.27,-771.6 730.27,-771.6 724.27,-765.6 724.27,-759.6 724.27,-759.6 724.27,-720 724.27,-720 724.27,-714 730.27,-708 736.27,-708 736.27,-708 896.62,-708 896.62,-708 902.62,-708 908.62,-714 908.62,-720 908.62,-720 908.62,-759.6 908.62,-759.6 908.62,-765.6 902.62,-771.6 896.62,-771.6\"/>\n",
       "<text text-anchor=\"start\" x=\"735.07\" y=\"-748.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_pickle_build_result</text>\n",
       "<text text-anchor=\"start\" x=\"782.32\" y=\"-720.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- spend_per_signup&#45;&gt;df_to_pickle_build_result -->\n",
       "<g id=\"edge20\" class=\"edge\">\n",
       "<title>spend_per_signup&#45;&gt;df_to_pickle_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M643.38,-711.37C665.08,-714.96 689.45,-718.98 712.89,-722.85\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"712,-726.26 722.44,-724.43 713.14,-719.35 712,-726.26\"/>\n",
       "</g>\n",
       "<!-- df_to_html_build_result -->\n",
       "<g id=\"node13\" class=\"node\">\n",
       "<title>df_to_html_build_result</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M892.12,-689.6C892.12,-689.6 740.77,-689.6 740.77,-689.6 734.77,-689.6 728.77,-683.6 728.77,-677.6 728.77,-677.6 728.77,-638 728.77,-638 728.77,-632 734.77,-626 740.77,-626 740.77,-626 892.12,-626 892.12,-626 898.12,-626 904.12,-632 904.12,-638 904.12,-638 904.12,-677.6 904.12,-677.6 904.12,-683.6 898.12,-689.6 892.12,-689.6\"/>\n",
       "<text text-anchor=\"start\" x=\"739.57\" y=\"-666.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_html_build_result</text>\n",
       "<text text-anchor=\"start\" x=\"782.32\" y=\"-638.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- spend_per_signup&#45;&gt;df_to_html_build_result -->\n",
       "<g id=\"edge27\" class=\"edge\">\n",
       "<title>spend_per_signup&#45;&gt;df_to_html_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M643.38,-687.65C666.39,-683.66 692.41,-679.15 717.12,-674.86\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"717.62,-678.32 726.87,-673.17 716.42,-671.43 717.62,-678.32\"/>\n",
       "</g>\n",
       "<!-- df_to_parquet_build_result -->\n",
       "<g id=\"node15\" class=\"node\">\n",
       "<title>df_to_parquet_build_result</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M902.25,-525.6C902.25,-525.6 730.65,-525.6 730.65,-525.6 724.65,-525.6 718.65,-519.6 718.65,-513.6 718.65,-513.6 718.65,-474 718.65,-474 718.65,-468 724.65,-462 730.65,-462 730.65,-462 902.25,-462 902.25,-462 908.25,-462 914.25,-468 914.25,-474 914.25,-474 914.25,-513.6 914.25,-513.6 914.25,-519.6 908.25,-525.6 902.25,-525.6\"/>\n",
       "<text text-anchor=\"start\" x=\"729.45\" y=\"-502.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_parquet_build_result</text>\n",
       "<text text-anchor=\"start\" x=\"782.32\" y=\"-474.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- spend_per_signup&#45;&gt;df_to_parquet_build_result -->\n",
       "<g id=\"edge32\" class=\"edge\">\n",
       "<title>spend_per_signup&#45;&gt;df_to_parquet_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M643.44,-687.5C660.6,-681.42 677.5,-672.35 689.65,-658.8 727.43,-616.65 682.19,-578.09 718.65,-534.8 718.9,-534.5 719.16,-534.2 719.42,-533.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"721.82,-536.45 726.49,-526.95 716.91,-531.46 721.82,-536.45\"/>\n",
       "</g>\n",
       "<!-- df_to_orc_build_result -->\n",
       "<g id=\"node17\" class=\"node\">\n",
       "<title>df_to_orc_build_result</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M888,-443.6C888,-443.6 744.9,-443.6 744.9,-443.6 738.9,-443.6 732.9,-437.6 732.9,-431.6 732.9,-431.6 732.9,-392 732.9,-392 732.9,-386 738.9,-380 744.9,-380 744.9,-380 888,-380 888,-380 894,-380 900,-386 900,-392 900,-392 900,-431.6 900,-431.6 900,-437.6 894,-443.6 888,-443.6\"/>\n",
       "<text text-anchor=\"start\" x=\"743.7\" y=\"-420.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_orc_build_result</text>\n",
       "<text text-anchor=\"start\" x=\"782.32\" y=\"-392.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- spend_per_signup&#45;&gt;df_to_orc_build_result -->\n",
       "<g id=\"edge37\" class=\"edge\">\n",
       "<title>spend_per_signup&#45;&gt;df_to_orc_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M643.36,-688.53C660.84,-682.46 677.92,-673.13 689.65,-658.8 748.21,-587.25 662.33,-526.12 718.65,-452.8 720.4,-450.52 722.3,-448.37 724.33,-446.33\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"726.32,-449.24 731.58,-440.04 721.73,-443.95 726.32,-449.24\"/>\n",
       "</g>\n",
       "<!-- df_to_feather_build_result -->\n",
       "<g id=\"node22\" class=\"node\">\n",
       "<title>df_to_feather_build_result</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M900,-197.6C900,-197.6 732.9,-197.6 732.9,-197.6 726.9,-197.6 720.9,-191.6 720.9,-185.6 720.9,-185.6 720.9,-146 720.9,-146 720.9,-140 726.9,-134 732.9,-134 732.9,-134 900,-134 900,-134 906,-134 912,-140 912,-146 912,-146 912,-185.6 912,-185.6 912,-191.6 906,-197.6 900,-197.6\"/>\n",
       "<text text-anchor=\"start\" x=\"731.7\" y=\"-174.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_feather_build_result</text>\n",
       "<text text-anchor=\"start\" x=\"782.32\" y=\"-146.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- spend_per_signup&#45;&gt;df_to_feather_build_result -->\n",
       "<g id=\"edge45\" class=\"edge\">\n",
       "<title>spend_per_signup&#45;&gt;df_to_feather_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M643.48,-689.31C661.18,-683.25 678.34,-673.74 689.65,-658.8 750.4,-578.55 660.41,-288.89 718.65,-206.8 718.8,-206.6 718.94,-206.39 719.09,-206.19\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"721.54,-208.7 725.5,-198.87 716.28,-204.09 721.54,-208.7\"/>\n",
       "</g>\n",
       "<!-- df_to_excel_build_result -->\n",
       "<g id=\"node25\" class=\"node\">\n",
       "<title>df_to_excel_build_result</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M894.37,-361.6C894.37,-361.6 738.52,-361.6 738.52,-361.6 732.52,-361.6 726.52,-355.6 726.52,-349.6 726.52,-349.6 726.52,-310 726.52,-310 726.52,-304 732.52,-298 738.52,-298 738.52,-298 894.37,-298 894.37,-298 900.37,-298 906.37,-304 906.37,-310 906.37,-310 906.37,-349.6 906.37,-349.6 906.37,-355.6 900.37,-361.6 894.37,-361.6\"/>\n",
       "<text text-anchor=\"start\" x=\"737.32\" y=\"-338.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_excel_build_result</text>\n",
       "<text text-anchor=\"start\" x=\"782.32\" y=\"-310.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- spend_per_signup&#45;&gt;df_to_excel_build_result -->\n",
       "<g id=\"edge51\" class=\"edge\">\n",
       "<title>spend_per_signup&#45;&gt;df_to_excel_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M643.44,-688.93C661.02,-682.87 678.14,-673.44 689.65,-658.8 769.15,-557.65 642.31,-474.35 718.65,-370.8 718.8,-370.6 718.95,-370.4 719.1,-370.2\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"721.53,-372.73 725.63,-362.97 716.33,-368.04 721.53,-372.73\"/>\n",
       "</g>\n",
       "<!-- df_to_csv_build_result -->\n",
       "<g id=\"node26\" class=\"node\">\n",
       "<title>df_to_csv_build_result</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M888.75,-279.6C888.75,-279.6 744.15,-279.6 744.15,-279.6 738.15,-279.6 732.15,-273.6 732.15,-267.6 732.15,-267.6 732.15,-228 732.15,-228 732.15,-222 738.15,-216 744.15,-216 744.15,-216 888.75,-216 888.75,-216 894.75,-216 900.75,-222 900.75,-228 900.75,-228 900.75,-267.6 900.75,-267.6 900.75,-273.6 894.75,-279.6 888.75,-279.6\"/>\n",
       "<text text-anchor=\"start\" x=\"742.95\" y=\"-256.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_csv_build_result</text>\n",
       "<text text-anchor=\"start\" x=\"782.32\" y=\"-228.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- spend_per_signup&#45;&gt;df_to_csv_build_result -->\n",
       "<g id=\"edge55\" class=\"edge\">\n",
       "<title>spend_per_signup&#45;&gt;df_to_csv_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M643.65,-689.1C661.24,-683.04 678.3,-673.57 689.65,-658.8 739.89,-593.4 670.45,-355.72 718.65,-288.8 720.17,-286.69 721.81,-284.7 723.57,-282.8\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"725.82,-285.49 730.82,-276.15 721.08,-280.33 725.82,-285.49\"/>\n",
       "</g>\n",
       "<!-- df_to_xml_build_result -->\n",
       "<g id=\"node27\" class=\"node\">\n",
       "<title>df_to_xml_build_result</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M889.5,-607.6C889.5,-607.6 743.4,-607.6 743.4,-607.6 737.4,-607.6 731.4,-601.6 731.4,-595.6 731.4,-595.6 731.4,-556 731.4,-556 731.4,-550 737.4,-544 743.4,-544 743.4,-544 889.5,-544 889.5,-544 895.5,-544 901.5,-550 901.5,-556 901.5,-556 901.5,-595.6 901.5,-595.6 901.5,-601.6 895.5,-607.6 889.5,-607.6\"/>\n",
       "<text text-anchor=\"start\" x=\"742.2\" y=\"-584.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_xml_build_result</text>\n",
       "<text text-anchor=\"start\" x=\"782.32\" y=\"-556.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- spend_per_signup&#45;&gt;df_to_xml_build_result -->\n",
       "<g id=\"edge59\" class=\"edge\">\n",
       "<title>spend_per_signup&#45;&gt;df_to_xml_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M643.38,-683.06C659.58,-677.11 676.04,-669.2 689.65,-658.8 707.67,-645.02 701.06,-631.13 718.65,-616.8 719.76,-615.89 720.9,-615 722.06,-614.13\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"723.81,-617.17 730.05,-608.62 719.83,-611.41 723.81,-617.17\"/>\n",
       "</g>\n",
       "<!-- df_to_pickle_build_result&#45;&gt;df_to_pickle -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>df_to_pickle_build_result&#45;&gt;df_to_pickle</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M909.01,-760.85C918.45,-763.02 927.99,-765.21 937.29,-767.35\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"936.49,-770.76 947.02,-769.59 938.06,-763.93 936.49,-770.76\"/>\n",
       "</g>\n",
       "<!-- spend_zero_mean_unit_variance&#45;&gt;df_to_sql_build_result -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>spend_zero_mean_unit_variance&#45;&gt;df_to_sql_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M681.36,-649.94C684.35,-652.65 687.14,-655.6 689.65,-658.8 768.63,-759.22 642.8,-841.99 718.65,-944.8 720.58,-947.42 722.71,-949.87 725,-952.16\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"722.37,-954.51 732.23,-958.39 726.94,-949.21 722.37,-954.51\"/>\n",
       "</g>\n",
       "<!-- spend_zero_mean_unit_variance&#45;&gt;df_to_json_build_result -->\n",
       "<g id=\"edge12\" class=\"edge\">\n",
       "<title>spend_zero_mean_unit_variance&#45;&gt;df_to_json_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M681.19,-650.07C684.24,-652.75 687.07,-655.65 689.65,-658.8 747.7,-729.63 662.81,-790.21 718.65,-862.8 719.43,-863.81 720.24,-864.8 721.07,-865.76\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"718.61,-868.25 728.2,-872.74 723.51,-863.25 718.61,-868.25\"/>\n",
       "</g>\n",
       "<!-- spend_zero_mean_unit_variance&#45;&gt;df_to_stata_build_result -->\n",
       "<g id=\"edge16\" class=\"edge\">\n",
       "<title>spend_zero_mean_unit_variance&#45;&gt;df_to_stata_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M680.33,-649.97C683.66,-652.68 686.79,-655.62 689.65,-658.8 726.93,-700.23 682.67,-738.24 718.65,-780.8 718.9,-781.1 719.16,-781.4 719.42,-781.7\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"716.92,-784.14 726.51,-788.64 721.81,-779.14 716.92,-784.14\"/>\n",
       "</g>\n",
       "<!-- spend_zero_mean_unit_variance&#45;&gt;df_to_pickle_build_result -->\n",
       "<g id=\"edge21\" class=\"edge\">\n",
       "<title>spend_zero_mean_unit_variance&#45;&gt;df_to_pickle_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M676.35,-650.05C680.98,-652.75 685.45,-655.66 689.65,-658.8 707.25,-671.93 701.47,-685.13 718.65,-698.8 719.77,-699.69 720.92,-700.57 722.09,-701.44\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"719.89,-704.17 730.13,-706.89 723.82,-698.38 719.89,-704.17\"/>\n",
       "</g>\n",
       "<!-- spend_zero_mean_unit_variance&#45;&gt;df_to_html_build_result -->\n",
       "<g id=\"edge28\" class=\"edge\">\n",
       "<title>spend_zero_mean_unit_variance&#45;&gt;df_to_html_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M690.15,-637.1C699.24,-638.6 708.37,-640.11 717.33,-641.59\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"716.63,-645.02 727.07,-643.2 717.77,-638.11 716.63,-645.02\"/>\n",
       "</g>\n",
       "<!-- spend_zero_mean_unit_variance&#45;&gt;df_to_parquet_build_result -->\n",
       "<g id=\"edge33\" class=\"edge\">\n",
       "<title>spend_zero_mean_unit_variance&#45;&gt;df_to_parquet_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M676.72,-585.5C681.23,-582.82 685.57,-579.92 689.65,-576.8 707.67,-563.02 701.06,-549.13 718.65,-534.8 719.61,-534.02 720.58,-533.26 721.56,-532.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"723.38,-535.51 729.58,-526.92 719.38,-529.76 723.38,-535.51\"/>\n",
       "</g>\n",
       "<!-- spend_zero_mean_unit_variance&#45;&gt;df_to_orc_build_result -->\n",
       "<g id=\"edge38\" class=\"edge\">\n",
       "<title>spend_zero_mean_unit_variance&#45;&gt;df_to_orc_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M680.34,-585.64C683.67,-582.93 686.79,-579.99 689.65,-576.8 727.43,-534.65 682.19,-496.09 718.65,-452.8 720.32,-450.82 722.11,-448.92 723.99,-447.12\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"726.18,-449.85 731.62,-440.76 721.7,-444.47 726.18,-449.85\"/>\n",
       "</g>\n",
       "<!-- spend_zero_mean_unit_variance&#45;&gt;df_to_feather_build_result -->\n",
       "<g id=\"edge46\" class=\"edge\">\n",
       "<title>spend_zero_mean_unit_variance&#45;&gt;df_to_feather_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M681.45,-585.74C684.42,-583 687.17,-580.03 689.65,-576.8 739.89,-511.4 670.45,-273.72 718.65,-206.8 718.8,-206.6 718.94,-206.39 719.09,-206.19\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"721.53,-208.71 725.55,-198.91 716.3,-204.07 721.53,-208.71\"/>\n",
       "</g>\n",
       "<!-- spend_zero_mean_unit_variance&#45;&gt;df_to_excel_build_result -->\n",
       "<g id=\"edge52\" class=\"edge\">\n",
       "<title>spend_zero_mean_unit_variance&#45;&gt;df_to_excel_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M681.2,-585.54C684.24,-582.85 687.07,-579.95 689.65,-576.8 748.21,-505.25 662.33,-444.12 718.65,-370.8 718.8,-370.6 718.96,-370.4 719.11,-370.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"721.51,-372.77 725.77,-363.07 716.39,-367.99 721.51,-372.77\"/>\n",
       "</g>\n",
       "<!-- spend_zero_mean_unit_variance&#45;&gt;df_to_csv_build_result -->\n",
       "<g id=\"edge56\" class=\"edge\">\n",
       "<title>spend_zero_mean_unit_variance&#45;&gt;df_to_csv_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M681.36,-585.67C684.36,-582.95 687.14,-580 689.65,-576.8 769.15,-475.65 642.31,-392.35 718.65,-288.8 720.19,-286.71 721.86,-284.73 723.63,-282.84\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"725.87,-285.54 730.94,-276.23 721.17,-280.35 725.87,-285.54\"/>\n",
       "</g>\n",
       "<!-- spend_zero_mean_unit_variance&#45;&gt;df_to_xml_build_result -->\n",
       "<g id=\"edge60\" class=\"edge\">\n",
       "<title>spend_zero_mean_unit_variance&#45;&gt;df_to_xml_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M690.15,-597.54C700.05,-595.82 710,-594.09 719.72,-592.41\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"720.26,-595.87 729.51,-590.71 719.06,-588.97 720.26,-595.87\"/>\n",
       "</g>\n",
       "<!-- df_to_feather -->\n",
       "<g id=\"node12\" class=\"node\">\n",
       "<title>df_to_feather</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M1093.47,-86.58C1093.47,-90.96 1059.89,-94.53 1018.55,-94.53 977.21,-94.53 943.62,-90.96 943.62,-86.58 943.62,-86.58 943.62,-15.03 943.62,-15.03 943.62,-10.64 977.21,-7.08 1018.55,-7.08 1059.89,-7.08 1093.47,-10.64 1093.47,-15.03 1093.47,-15.03 1093.47,-86.58 1093.47,-86.58\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1093.47,-86.58C1093.47,-82.19 1059.89,-78.62 1018.55,-78.62 977.21,-78.62 943.62,-82.19 943.62,-86.58\"/>\n",
       "<text text-anchor=\"start\" x=\"975.8\" y=\"-59.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_feather</text>\n",
       "<text text-anchor=\"start\" x=\"954.42\" y=\"-31.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">PandasFeatherWriter</text>\n",
       "</g>\n",
       "<!-- df_to_html -->\n",
       "<g id=\"node14\" class=\"node\">\n",
       "<title>df_to_html</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M1084.47,-716.57C1084.47,-720.96 1054.93,-724.52 1018.55,-724.52 982.17,-724.52 952.62,-720.96 952.62,-716.57 952.62,-716.57 952.62,-645.02 952.62,-645.02 952.62,-640.64 982.17,-637.07 1018.55,-637.07 1054.93,-637.07 1084.47,-640.64 1084.47,-645.02 1084.47,-645.02 1084.47,-716.57 1084.47,-716.57\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1084.47,-716.57C1084.47,-712.19 1054.93,-708.62 1018.55,-708.62 982.17,-708.62 952.62,-712.19 952.62,-716.57\"/>\n",
       "<text text-anchor=\"start\" x=\"983.67\" y=\"-689.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_html</text>\n",
       "<text text-anchor=\"start\" x=\"963.42\" y=\"-661.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">PandasHtmlWriter</text>\n",
       "</g>\n",
       "<!-- df_to_html_build_result&#45;&gt;df_to_html -->\n",
       "<g id=\"edge30\" class=\"edge\">\n",
       "<title>df_to_html_build_result&#45;&gt;df_to_html</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M904.34,-667.79C916.49,-669.18 928.91,-670.61 940.85,-671.98\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"940.29,-675.44 950.63,-673.11 941.09,-668.49 940.29,-675.44\"/>\n",
       "</g>\n",
       "<!-- df_to_parquet -->\n",
       "<g id=\"node18\" class=\"node\">\n",
       "<title>df_to_parquet</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M1093.85,-506.57C1093.85,-510.96 1060.1,-514.52 1018.55,-514.52 977,-514.52 943.25,-510.96 943.25,-506.57 943.25,-506.57 943.25,-435.03 943.25,-435.03 943.25,-430.64 977,-427.08 1018.55,-427.08 1060.1,-427.08 1093.85,-430.64 1093.85,-435.03 1093.85,-435.03 1093.85,-506.57 1093.85,-506.57\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1093.85,-506.57C1093.85,-502.19 1060.1,-498.62 1018.55,-498.62 977,-498.62 943.25,-502.19 943.25,-506.57\"/>\n",
       "<text text-anchor=\"start\" x=\"973.55\" y=\"-479.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_parquet</text>\n",
       "<text text-anchor=\"start\" x=\"954.05\" y=\"-451.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">PandasParquetWriter</text>\n",
       "</g>\n",
       "<!-- df_to_parquet_build_result&#45;&gt;df_to_parquet -->\n",
       "<g id=\"edge40\" class=\"edge\">\n",
       "<title>df_to_parquet_build_result&#45;&gt;df_to_parquet</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M914.57,-482.64C920.39,-481.97 926.23,-481.3 932.01,-480.63\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"931.97,-484.16 941.5,-479.54 931.17,-477.21 931.97,-484.16\"/>\n",
       "</g>\n",
       "<!-- df_to_orc -->\n",
       "<g id=\"node16\" class=\"node\">\n",
       "<title>df_to_orc</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M1085.6,-401.57C1085.6,-405.96 1055.55,-409.52 1018.55,-409.52 981.55,-409.52 951.5,-405.96 951.5,-401.57 951.5,-401.57 951.5,-330.03 951.5,-330.03 951.5,-325.64 981.55,-322.08 1018.55,-322.08 1055.55,-322.08 1085.6,-325.64 1085.6,-330.03 1085.6,-330.03 1085.6,-401.57 1085.6,-401.57\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1085.6,-401.57C1085.6,-397.19 1055.55,-393.62 1018.55,-393.62 981.55,-393.62 951.5,-397.19 951.5,-401.57\"/>\n",
       "<text text-anchor=\"start\" x=\"987.8\" y=\"-374.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_orc</text>\n",
       "<text text-anchor=\"start\" x=\"962.3\" y=\"-346.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">PandasORCWriter</text>\n",
       "</g>\n",
       "<!-- df_to_orc_build_result&#45;&gt;df_to_orc -->\n",
       "<g id=\"edge35\" class=\"edge\">\n",
       "<title>df_to_orc_build_result&#45;&gt;df_to_orc</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M900.28,-392.76C913.55,-389.71 927.24,-386.56 940.38,-383.54\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"940.82,-387.03 949.78,-381.38 939.25,-380.21 940.82,-387.03\"/>\n",
       "</g>\n",
       "<!-- spend_mean -->\n",
       "<g id=\"node19\" class=\"node\">\n",
       "<title>spend_mean</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M242.07,-572.6C242.07,-572.6 161.22,-572.6 161.22,-572.6 155.22,-572.6 149.22,-566.6 149.22,-560.6 149.22,-560.6 149.22,-521 149.22,-521 149.22,-515 155.22,-509 161.22,-509 161.22,-509 242.07,-509 242.07,-509 248.07,-509 254.07,-515 254.07,-521 254.07,-521 254.07,-560.6 254.07,-560.6 254.07,-566.6 248.07,-572.6 242.07,-572.6\"/>\n",
       "<text text-anchor=\"start\" x=\"160.02\" y=\"-549.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">spend_mean</text>\n",
       "<text text-anchor=\"start\" x=\"188.9\" y=\"-521.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">float</text>\n",
       "</g>\n",
       "<!-- spend_zero_mean -->\n",
       "<g id=\"node28\" class=\"node\">\n",
       "<title>spend_zero_mean</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M414.05,-567.6C414.05,-567.6 297.95,-567.6 297.95,-567.6 291.95,-567.6 285.95,-561.6 285.95,-555.6 285.95,-555.6 285.95,-516 285.95,-516 285.95,-510 291.95,-504 297.95,-504 297.95,-504 414.05,-504 414.05,-504 420.05,-504 426.05,-510 426.05,-516 426.05,-516 426.05,-555.6 426.05,-555.6 426.05,-561.6 420.05,-567.6 414.05,-567.6\"/>\n",
       "<text text-anchor=\"start\" x=\"296.75\" y=\"-544.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">spend_zero_mean</text>\n",
       "<text text-anchor=\"start\" x=\"336.87\" y=\"-516.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- spend_mean&#45;&gt;spend_zero_mean -->\n",
       "<g id=\"edge62\" class=\"edge\">\n",
       "<title>spend_mean&#45;&gt;spend_zero_mean</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M254.23,-539.11C260.7,-538.89 267.43,-538.67 274.22,-538.45\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"274.25,-541.95 284.13,-538.13 274.02,-534.96 274.25,-541.95\"/>\n",
       "</g>\n",
       "<!-- df_to_excel -->\n",
       "<g id=\"node20\" class=\"node\">\n",
       "<title>df_to_excel</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M1086.72,-296.57C1086.72,-300.96 1056.17,-304.52 1018.55,-304.52 980.93,-304.52 950.38,-300.96 950.38,-296.57 950.38,-296.57 950.38,-225.03 950.38,-225.03 950.38,-220.64 980.93,-217.08 1018.55,-217.08 1056.17,-217.08 1086.72,-220.64 1086.72,-225.03 1086.72,-225.03 1086.72,-296.57 1086.72,-296.57\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1086.72,-296.57C1086.72,-292.19 1056.17,-288.62 1018.55,-288.62 980.93,-288.62 950.38,-292.19 950.38,-296.57\"/>\n",
       "<text text-anchor=\"start\" x=\"981.42\" y=\"-269.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_excel</text>\n",
       "<text text-anchor=\"start\" x=\"961.17\" y=\"-241.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">PandasExcelWriter</text>\n",
       "</g>\n",
       "<!-- df_to_feather_build_result&#45;&gt;df_to_feather -->\n",
       "<g id=\"edge25\" class=\"edge\">\n",
       "<title>df_to_feather_build_result&#45;&gt;df_to_feather</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M873.46,-133.61C893.02,-122.37 915.39,-109.51 936.57,-97.34\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"938.3,-100.39 945.22,-92.37 934.81,-94.32 938.3,-100.39\"/>\n",
       "</g>\n",
       "<!-- avg_3wk_spend -->\n",
       "<g id=\"node23\" class=\"node\">\n",
       "<title>avg_3wk_spend</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M623.27,-483.6C623.27,-483.6 521.42,-483.6 521.42,-483.6 515.42,-483.6 509.42,-477.6 509.42,-471.6 509.42,-471.6 509.42,-432 509.42,-432 509.42,-426 515.42,-420 521.42,-420 521.42,-420 623.27,-420 623.27,-420 629.27,-420 635.27,-426 635.27,-432 635.27,-432 635.27,-471.6 635.27,-471.6 635.27,-477.6 629.27,-483.6 623.27,-483.6\"/>\n",
       "<text text-anchor=\"start\" x=\"520.22\" y=\"-460.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">avg_3wk_spend</text>\n",
       "<text text-anchor=\"start\" x=\"553.22\" y=\"-432.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- avg_3wk_spend&#45;&gt;df_to_sql_build_result -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>avg_3wk_spend&#45;&gt;df_to_sql_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M635.58,-459.82C655.95,-465.64 676.66,-475.65 689.65,-492.8 750.4,-573.05 660.41,-862.71 718.65,-944.8 720.58,-947.52 722.73,-950.06 725.05,-952.44\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"722.61,-954.95 732.44,-958.88 727.21,-949.67 722.61,-954.95\"/>\n",
       "</g>\n",
       "<!-- avg_3wk_spend&#45;&gt;df_to_json_build_result -->\n",
       "<g id=\"edge10\" class=\"edge\">\n",
       "<title>avg_3wk_spend&#45;&gt;df_to_json_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M635.75,-460.01C656.01,-465.85 676.61,-475.82 689.65,-492.8 739.89,-558.2 670.45,-795.88 718.65,-862.8 719.52,-864.01 720.43,-865.18 721.38,-866.32\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"718.8,-868.68 728.33,-873.32 723.77,-863.75 718.8,-868.68\"/>\n",
       "</g>\n",
       "<!-- avg_3wk_spend&#45;&gt;df_to_stata_build_result -->\n",
       "<g id=\"edge14\" class=\"edge\">\n",
       "<title>avg_3wk_spend&#45;&gt;df_to_stata_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M635.54,-460.17C655.78,-466.03 676.42,-475.97 689.65,-492.8 769.15,-593.95 642.31,-677.25 718.65,-780.8 718.97,-781.24 719.31,-781.68 719.64,-782.11\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"717.04,-784.45 726.42,-789.39 722.17,-779.69 717.04,-784.45\"/>\n",
       "</g>\n",
       "<!-- avg_3wk_spend&#45;&gt;df_to_pickle_build_result -->\n",
       "<g id=\"edge19\" class=\"edge\">\n",
       "<title>avg_3wk_spend&#45;&gt;df_to_pickle_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M635.47,-460.55C655.59,-466.45 676.16,-476.32 689.65,-492.8 748.21,-564.35 662.33,-625.48 718.65,-698.8 718.8,-699 718.96,-699.2 719.11,-699.39\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"716.39,-701.61 725.77,-706.53 721.51,-696.83 716.39,-701.61\"/>\n",
       "</g>\n",
       "<!-- avg_3wk_spend&#45;&gt;df_to_html_build_result -->\n",
       "<g id=\"edge26\" class=\"edge\">\n",
       "<title>avg_3wk_spend&#45;&gt;df_to_html_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M635.57,-461.52C655.32,-467.51 675.65,-477.18 689.65,-492.8 727.43,-534.95 682.19,-573.51 718.65,-616.8 719.2,-617.45 719.76,-618.1 720.34,-618.73\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"717.67,-621.02 727.32,-625.38 722.49,-615.95 717.67,-621.02\"/>\n",
       "</g>\n",
       "<!-- avg_3wk_spend&#45;&gt;df_to_parquet_build_result -->\n",
       "<g id=\"edge31\" class=\"edge\">\n",
       "<title>avg_3wk_spend&#45;&gt;df_to_parquet_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M635.7,-462.62C657.57,-466.41 682.81,-470.79 707.33,-475.04\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"706.59,-478.47 717.05,-476.73 707.79,-471.57 706.59,-478.47\"/>\n",
       "</g>\n",
       "<!-- avg_3wk_spend&#45;&gt;df_to_orc_build_result -->\n",
       "<g id=\"edge36\" class=\"edge\">\n",
       "<title>avg_3wk_spend&#45;&gt;df_to_orc_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M635.7,-441.5C661.79,-437.19 692.69,-432.08 721.45,-427.33\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"721.98,-430.79 731.28,-425.71 720.84,-423.88 721.98,-430.79\"/>\n",
       "</g>\n",
       "<!-- avg_3wk_spend&#45;&gt;df_to_feather_build_result -->\n",
       "<g id=\"edge44\" class=\"edge\">\n",
       "<title>avg_3wk_spend&#45;&gt;df_to_feather_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M635.76,-442.95C655.78,-437.04 676.22,-427.19 689.65,-410.8 747.7,-339.97 662.81,-279.39 718.65,-206.8 718.8,-206.6 718.96,-206.4 719.11,-206.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"721.51,-208.77 725.77,-199.07 716.39,-203.99 721.51,-208.77\"/>\n",
       "</g>\n",
       "<!-- avg_3wk_spend&#45;&gt;df_to_excel_build_result -->\n",
       "<g id=\"edge50\" class=\"edge\">\n",
       "<title>avg_3wk_spend&#45;&gt;df_to_excel_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M635.65,-437.49C654.19,-431.28 673.78,-422.65 689.65,-410.8 707.25,-397.67 701.47,-384.47 718.65,-370.8 719.77,-369.91 720.92,-369.03 722.09,-368.16\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"723.82,-371.22 730.13,-362.71 719.89,-365.43 723.82,-371.22\"/>\n",
       "</g>\n",
       "<!-- avg_3wk_spend&#45;&gt;df_to_csv_build_result -->\n",
       "<g id=\"edge54\" class=\"edge\">\n",
       "<title>avg_3wk_spend&#45;&gt;df_to_csv_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M635.53,-442.05C655.29,-436.06 675.62,-426.4 689.65,-410.8 726.93,-369.37 682.67,-331.36 718.65,-288.8 720.11,-287.08 721.65,-285.42 723.27,-283.84\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"725.42,-286.6 730.76,-277.44 720.88,-281.27 725.42,-286.6\"/>\n",
       "</g>\n",
       "<!-- avg_3wk_spend&#45;&gt;df_to_xml_build_result -->\n",
       "<g id=\"edge58\" class=\"edge\">\n",
       "<title>avg_3wk_spend&#45;&gt;df_to_xml_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M635.52,-465.79C654.16,-471.99 673.83,-480.71 689.65,-492.8 707.67,-506.58 701.06,-520.47 718.65,-534.8 719.76,-535.71 720.9,-536.6 722.06,-537.47\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"719.83,-540.19 730.05,-542.98 723.81,-534.43 719.83,-540.19\"/>\n",
       "</g>\n",
       "<!-- df_to_csv -->\n",
       "<g id=\"node24\" class=\"node\">\n",
       "<title>df_to_csv</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M1084.1,-191.57C1084.1,-195.96 1054.72,-199.53 1018.55,-199.53 982.38,-199.53 953,-195.96 953,-191.57 953,-191.57 953,-120.03 953,-120.03 953,-115.64 982.38,-112.08 1018.55,-112.08 1054.72,-112.08 1084.1,-115.64 1084.1,-120.03 1084.1,-120.03 1084.1,-191.57 1084.1,-191.57\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1084.1,-191.57C1084.1,-187.19 1054.72,-183.62 1018.55,-183.62 982.38,-183.62 953,-187.19 953,-191.57\"/>\n",
       "<text text-anchor=\"start\" x=\"987.05\" y=\"-164.5\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df_to_csv</text>\n",
       "<text text-anchor=\"start\" x=\"963.8\" y=\"-136.5\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">PandasCSVWriter</text>\n",
       "</g>\n",
       "<!-- df_to_excel_build_result&#45;&gt;df_to_excel -->\n",
       "<g id=\"edge42\" class=\"edge\">\n",
       "<title>df_to_excel_build_result&#45;&gt;df_to_excel</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M906.67,-299.03C917.62,-295.26 928.73,-291.43 939.49,-287.72\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"940.37,-291.11 948.69,-284.55 938.09,-284.5 940.37,-291.11\"/>\n",
       "</g>\n",
       "<!-- df_to_csv_build_result&#45;&gt;df_to_csv -->\n",
       "<g id=\"edge49\" class=\"edge\">\n",
       "<title>df_to_csv_build_result&#45;&gt;df_to_csv</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M894.77,-215.53C901.38,-212.62 907.94,-209.69 914.25,-206.8 923.4,-202.61 932.94,-198.1 942.36,-193.55\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"943.7,-196.79 951.16,-189.28 940.64,-190.5 943.7,-196.79\"/>\n",
       "</g>\n",
       "<!-- df_to_xml_build_result&#45;&gt;df_to_xml -->\n",
       "<g id=\"edge8\" class=\"edge\">\n",
       "<title>df_to_xml_build_result&#45;&gt;df_to_xml</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M901.73,-575.8C915.58,-575.8 929.85,-575.8 943.43,-575.8\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"943.14,-579.3 953.14,-575.8 943.14,-572.3 943.14,-579.3\"/>\n",
       "</g>\n",
       "<!-- spend_zero_mean&#45;&gt;spend_zero_mean_unit_variance -->\n",
       "<g id=\"edge23\" class=\"edge\">\n",
       "<title>spend_zero_mean&#45;&gt;spend_zero_mean_unit_variance</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M426.43,-565.41C436.01,-569.33 445.75,-573.22 455.05,-576.8 459.2,-578.4 463.45,-580.01 467.74,-581.62\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"466.48,-584.88 477.07,-585.07 468.91,-578.32 466.48,-584.88\"/>\n",
       "</g>\n",
       "<!-- _spend_std_dev_inputs -->\n",
       "<g id=\"node29\" class=\"node\">\n",
       "<title>_spend_std_dev_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"256.95,-640.1 146.35,-640.1 146.35,-595.5 256.95,-595.5 256.95,-640.1\"/>\n",
       "<text text-anchor=\"start\" x=\"161.15\" y=\"-612\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"203.9\" y=\"-612\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _spend_std_dev_inputs&#45;&gt;spend_std_dev -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>_spend_std_dev_inputs&#45;&gt;spend_std_dev</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M257.22,-617.8C265.99,-617.8 275.17,-617.8 284.25,-617.8\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"284.14,-621.3 294.14,-617.8 284.14,-614.3 284.14,-621.3\"/>\n",
       "</g>\n",
       "<!-- _df_to_sql_build_result_inputs -->\n",
       "<g id=\"node30\" class=\"node\">\n",
       "<title>_df_to_sql_build_result_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"632.15,-1151.6 512.55,-1151.6 512.55,-1086 632.15,-1086 632.15,-1151.6\"/>\n",
       "<text text-anchor=\"start\" x=\"531.97\" y=\"-1123.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-1123.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "<text text-anchor=\"start\" x=\"527.1\" y=\"-1102.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">signups</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-1102.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _df_to_sql_build_result_inputs&#45;&gt;df_to_sql_build_result -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>_df_to_sql_build_result_inputs&#45;&gt;df_to_sql_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M632.4,-1101.07C651.18,-1094.49 671.72,-1086.28 689.65,-1076.8 717.09,-1062.29 745.29,-1042.43 768.02,-1024.96\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"770.16,-1027.73 775.89,-1018.82 765.85,-1022.21 770.16,-1027.73\"/>\n",
       "</g>\n",
       "<!-- _df_to_json_build_result_inputs -->\n",
       "<g id=\"node31\" class=\"node\">\n",
       "<title>_df_to_json_build_result_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"632.15,-1067.6 512.55,-1067.6 512.55,-1002 632.15,-1002 632.15,-1067.6\"/>\n",
       "<text text-anchor=\"start\" x=\"531.97\" y=\"-1039.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-1039.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "<text text-anchor=\"start\" x=\"527.1\" y=\"-1018.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">signups</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-1018.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _df_to_json_build_result_inputs&#45;&gt;df_to_json_build_result -->\n",
       "<g id=\"edge13\" class=\"edge\">\n",
       "<title>_df_to_json_build_result_inputs&#45;&gt;df_to_json_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M632.38,-1021.99C652.1,-1015.61 673.22,-1006.28 689.65,-992.8 708.92,-976.99 699.81,-961.12 718.65,-944.8 719.43,-944.12 720.23,-943.45 721.04,-942.79\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"722.94,-945.74 728.91,-936.99 718.78,-940.11 722.94,-945.74\"/>\n",
       "</g>\n",
       "<!-- _df_to_stata_build_result_inputs -->\n",
       "<g id=\"node32\" class=\"node\">\n",
       "<title>_df_to_stata_build_result_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"632.15,-983.6 512.55,-983.6 512.55,-918 632.15,-918 632.15,-983.6\"/>\n",
       "<text text-anchor=\"start\" x=\"531.97\" y=\"-955.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-955.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "<text text-anchor=\"start\" x=\"527.1\" y=\"-934.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">signups</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-934.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _df_to_stata_build_result_inputs&#45;&gt;df_to_stata_build_result -->\n",
       "<g id=\"edge17\" class=\"edge\">\n",
       "<title>_df_to_stata_build_result_inputs&#45;&gt;df_to_stata_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M632.54,-937.72C652.16,-931.33 673.17,-922.05 689.65,-908.8 708.48,-893.65 700.23,-878.45 718.65,-862.8 719.59,-862 720.55,-861.22 721.52,-860.45\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"723.36,-863.43 729.44,-854.75 719.28,-857.75 723.36,-863.43\"/>\n",
       "</g>\n",
       "<!-- _spend_per_signup_inputs -->\n",
       "<g id=\"node33\" class=\"node\">\n",
       "<title>_spend_per_signup_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"415.8,-733.6 296.2,-733.6 296.2,-668 415.8,-668 415.8,-733.6\"/>\n",
       "<text text-anchor=\"start\" x=\"315.62\" y=\"-705.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"362.87\" y=\"-705.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "<text text-anchor=\"start\" x=\"310.75\" y=\"-684.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">signups</text>\n",
       "<text text-anchor=\"start\" x=\"362.87\" y=\"-684.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _spend_per_signup_inputs&#45;&gt;spend_per_signup -->\n",
       "<g id=\"edge18\" class=\"edge\">\n",
       "<title>_spend_per_signup_inputs&#45;&gt;spend_per_signup</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M416.14,-700.52C438.93,-700.42 465.36,-700.29 489.89,-700.18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"489.88,-703.68 499.87,-700.13 489.85,-696.68 489.88,-703.68\"/>\n",
       "</g>\n",
       "<!-- _df_to_pickle_build_result_inputs -->\n",
       "<g id=\"node34\" class=\"node\">\n",
       "<title>_df_to_pickle_build_result_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"632.15,-899.6 512.55,-899.6 512.55,-834 632.15,-834 632.15,-899.6\"/>\n",
       "<text text-anchor=\"start\" x=\"531.97\" y=\"-871.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-871.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "<text text-anchor=\"start\" x=\"527.1\" y=\"-850.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">signups</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-850.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _df_to_pickle_build_result_inputs&#45;&gt;df_to_pickle_build_result -->\n",
       "<g id=\"edge22\" class=\"edge\">\n",
       "<title>_df_to_pickle_build_result_inputs&#45;&gt;df_to_pickle_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M632.39,-853.53C652,-847.12 673.04,-837.89 689.65,-824.8 708.05,-810.31 700.65,-795.79 718.65,-780.8 719.6,-780.01 720.56,-779.24 721.54,-778.47\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"723.37,-781.47 729.51,-772.83 719.32,-775.75 723.37,-781.47\"/>\n",
       "</g>\n",
       "<!-- _df_to_html_build_result_inputs -->\n",
       "<g id=\"node35\" class=\"node\">\n",
       "<title>_df_to_html_build_result_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"632.15,-815.6 512.55,-815.6 512.55,-750 632.15,-750 632.15,-815.6\"/>\n",
       "<text text-anchor=\"start\" x=\"531.97\" y=\"-787.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-787.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "<text text-anchor=\"start\" x=\"527.1\" y=\"-766.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">signups</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-766.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _df_to_html_build_result_inputs&#45;&gt;df_to_html_build_result -->\n",
       "<g id=\"edge29\" class=\"edge\">\n",
       "<title>_df_to_html_build_result_inputs&#45;&gt;df_to_html_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M632.53,-769.23C652.04,-762.81 672.99,-753.64 689.65,-740.8 707.62,-726.95 701.06,-713.13 718.65,-698.8 719.61,-698.02 720.58,-697.26 721.56,-696.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"723.38,-699.51 729.58,-690.92 719.38,-693.76 723.38,-699.51\"/>\n",
       "</g>\n",
       "<!-- _df_to_parquet_build_result_inputs -->\n",
       "<g id=\"node36\" class=\"node\">\n",
       "<title>_df_to_parquet_build_result_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"632.15,-401.6 512.55,-401.6 512.55,-336 632.15,-336 632.15,-401.6\"/>\n",
       "<text text-anchor=\"start\" x=\"531.97\" y=\"-373.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-373.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "<text text-anchor=\"start\" x=\"527.1\" y=\"-352.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">signups</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-352.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _df_to_parquet_build_result_inputs&#45;&gt;df_to_parquet_build_result -->\n",
       "<g id=\"edge34\" class=\"edge\">\n",
       "<title>_df_to_parquet_build_result_inputs&#45;&gt;df_to_parquet_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M632.53,-382.37C652.04,-388.79 672.99,-397.96 689.65,-410.8 707.62,-424.65 701.06,-438.47 718.65,-452.8 719.61,-453.58 720.58,-454.34 721.56,-455.1\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"719.38,-457.84 729.58,-460.68 723.38,-452.09 719.38,-457.84\"/>\n",
       "</g>\n",
       "<!-- _df_to_orc_build_result_inputs -->\n",
       "<g id=\"node37\" class=\"node\">\n",
       "<title>_df_to_orc_build_result_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"632.15,-317.6 512.55,-317.6 512.55,-252 632.15,-252 632.15,-317.6\"/>\n",
       "<text text-anchor=\"start\" x=\"531.97\" y=\"-289.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-289.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "<text text-anchor=\"start\" x=\"527.1\" y=\"-268.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">signups</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-268.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _df_to_orc_build_result_inputs&#45;&gt;df_to_orc_build_result -->\n",
       "<g id=\"edge39\" class=\"edge\">\n",
       "<title>_df_to_orc_build_result_inputs&#45;&gt;df_to_orc_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M632.39,-298.07C652,-304.48 673.04,-313.71 689.65,-326.8 708.05,-341.29 700.65,-355.81 718.65,-370.8 720.14,-372.04 721.68,-373.26 723.26,-374.44\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"721.16,-377.24 731.39,-379.99 725.11,-371.46 721.16,-377.24\"/>\n",
       "</g>\n",
       "<!-- _spend_mean_inputs -->\n",
       "<g id=\"node38\" class=\"node\">\n",
       "<title>_spend_mean_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"117.35,-563.1 6.75,-563.1 6.75,-518.5 117.35,-518.5 117.35,-563.1\"/>\n",
       "<text text-anchor=\"start\" x=\"21.55\" y=\"-535\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"64.3\" y=\"-535\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _spend_mean_inputs&#45;&gt;spend_mean -->\n",
       "<g id=\"edge41\" class=\"edge\">\n",
       "<title>_spend_mean_inputs&#45;&gt;spend_mean</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M117.83,-540.8C124.36,-540.8 131.06,-540.8 137.7,-540.8\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"137.23,-544.3 147.23,-540.8 137.23,-537.3 137.23,-544.3\"/>\n",
       "</g>\n",
       "<!-- _df_to_feather_build_result_inputs -->\n",
       "<g id=\"node39\" class=\"node\">\n",
       "<title>_df_to_feather_build_result_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"632.15,-65.6 512.55,-65.6 512.55,0 632.15,0 632.15,-65.6\"/>\n",
       "<text text-anchor=\"start\" x=\"531.97\" y=\"-37.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-37.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "<text text-anchor=\"start\" x=\"527.1\" y=\"-16.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">signups</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-16.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _df_to_feather_build_result_inputs&#45;&gt;df_to_feather_build_result -->\n",
       "<g id=\"edge47\" class=\"edge\">\n",
       "<title>_df_to_feather_build_result_inputs&#45;&gt;df_to_feather_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M632.4,-50.53C651.18,-57.11 671.72,-65.32 689.65,-74.8 717.09,-89.31 745.29,-109.17 768.02,-126.64\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"765.85,-129.39 775.89,-132.78 770.16,-123.87 765.85,-129.39\"/>\n",
       "</g>\n",
       "<!-- _avg_3wk_spend_inputs -->\n",
       "<g id=\"node40\" class=\"node\">\n",
       "<title>_avg_3wk_spend_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"411.3,-474.1 300.7,-474.1 300.7,-429.5 411.3,-429.5 411.3,-474.1\"/>\n",
       "<text text-anchor=\"start\" x=\"315.5\" y=\"-446\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"358.25\" y=\"-446\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _avg_3wk_spend_inputs&#45;&gt;avg_3wk_spend -->\n",
       "<g id=\"edge48\" class=\"edge\">\n",
       "<title>_avg_3wk_spend_inputs&#45;&gt;avg_3wk_spend</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M411.64,-451.8C437.81,-451.8 469.52,-451.8 497.77,-451.8\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"497.71,-455.3 507.71,-451.8 497.71,-448.3 497.71,-455.3\"/>\n",
       "</g>\n",
       "<!-- _df_to_excel_build_result_inputs -->\n",
       "<g id=\"node41\" class=\"node\">\n",
       "<title>_df_to_excel_build_result_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"632.15,-233.6 512.55,-233.6 512.55,-168 632.15,-168 632.15,-233.6\"/>\n",
       "<text text-anchor=\"start\" x=\"531.97\" y=\"-205.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-205.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "<text text-anchor=\"start\" x=\"527.1\" y=\"-184.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">signups</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-184.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _df_to_excel_build_result_inputs&#45;&gt;df_to_excel_build_result -->\n",
       "<g id=\"edge53\" class=\"edge\">\n",
       "<title>_df_to_excel_build_result_inputs&#45;&gt;df_to_excel_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M632.54,-213.88C652.16,-220.27 673.17,-229.55 689.65,-242.8 708.48,-257.95 700.23,-273.15 718.65,-288.8 719.59,-289.6 720.55,-290.38 721.52,-291.15\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"719.28,-293.85 729.44,-296.85 723.36,-288.17 719.28,-293.85\"/>\n",
       "</g>\n",
       "<!-- _df_to_csv_build_result_inputs -->\n",
       "<g id=\"node42\" class=\"node\">\n",
       "<title>_df_to_csv_build_result_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"632.15,-149.6 512.55,-149.6 512.55,-84 632.15,-84 632.15,-149.6\"/>\n",
       "<text text-anchor=\"start\" x=\"531.97\" y=\"-121.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-121.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "<text text-anchor=\"start\" x=\"527.1\" y=\"-100.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">signups</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-100.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _df_to_csv_build_result_inputs&#45;&gt;df_to_csv_build_result -->\n",
       "<g id=\"edge57\" class=\"edge\">\n",
       "<title>_df_to_csv_build_result_inputs&#45;&gt;df_to_csv_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M632.38,-129.61C652.1,-135.99 673.22,-145.32 689.65,-158.8 708.92,-174.61 699.81,-190.48 718.65,-206.8 719.94,-207.92 721.27,-209.01 722.63,-210.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"720.59,-212.92 730.77,-215.86 724.64,-207.22 720.59,-212.92\"/>\n",
       "</g>\n",
       "<!-- _df_to_xml_build_result_inputs -->\n",
       "<g id=\"node43\" class=\"node\">\n",
       "<title>_df_to_xml_build_result_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"632.15,-567.6 512.55,-567.6 512.55,-502 632.15,-502 632.15,-567.6\"/>\n",
       "<text text-anchor=\"start\" x=\"531.97\" y=\"-539.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-539.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "<text text-anchor=\"start\" x=\"527.1\" y=\"-518.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">signups</text>\n",
       "<text text-anchor=\"start\" x=\"579.22\" y=\"-518.5\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _df_to_xml_build_result_inputs&#45;&gt;df_to_xml_build_result -->\n",
       "<g id=\"edge61\" class=\"edge\">\n",
       "<title>_df_to_xml_build_result_inputs&#45;&gt;df_to_xml_build_result</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M632.57,-544.83C658.89,-549.29 690.53,-554.65 720.05,-559.64\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"719.3,-563.07 729.74,-561.29 720.47,-556.17 719.3,-563.07\"/>\n",
       "</g>\n",
       "<!-- _spend_zero_mean_inputs -->\n",
       "<g id=\"node44\" class=\"node\">\n",
       "<title>_spend_zero_mean_inputs</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"256.95,-491.1 146.35,-491.1 146.35,-446.5 256.95,-446.5 256.95,-491.1\"/>\n",
       "<text text-anchor=\"start\" x=\"161.15\" y=\"-463\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">spend</text>\n",
       "<text text-anchor=\"start\" x=\"203.9\" y=\"-463\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- _spend_zero_mean_inputs&#45;&gt;spend_zero_mean -->\n",
       "<g id=\"edge63\" class=\"edge\">\n",
       "<title>_spend_zero_mean_inputs&#45;&gt;spend_zero_mean</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M254.23,-491.48C261.01,-494.47 268.09,-497.58 275.21,-500.71\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"273.7,-503.87 284.26,-504.69 276.51,-497.46 273.7,-503.87\"/>\n",
       "</g>\n",
       "<!-- input -->\n",
       "<g id=\"node45\" class=\"node\">\n",
       "<title>input</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"89.05,-787.1 35.05,-787.1 35.05,-750.5 89.05,-750.5 89.05,-787.1\"/>\n",
       "<text text-anchor=\"middle\" x=\"62.05\" y=\"-763\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">input</text>\n",
       "</g>\n",
       "<!-- function -->\n",
       "<g id=\"node46\" class=\"node\">\n",
       "<title>function</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M84.47,-732.1C84.47,-732.1 39.62,-732.1 39.62,-732.1 33.62,-732.1 27.62,-726.1 27.62,-720.1 27.62,-720.1 27.62,-707.5 27.62,-707.5 27.62,-701.5 33.62,-695.5 39.62,-695.5 39.62,-695.5 84.47,-695.5 84.47,-695.5 90.47,-695.5 96.47,-701.5 96.47,-707.5 96.47,-707.5 96.47,-720.1 96.47,-720.1 96.47,-726.1 90.47,-732.1 84.47,-732.1\"/>\n",
       "<text text-anchor=\"middle\" x=\"62.05\" y=\"-708\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">function</text>\n",
       "</g>\n",
       "<!-- output -->\n",
       "<g id=\"node47\" class=\"node\">\n",
       "<title>output</title>\n",
       "<path fill=\"#ffc857\" stroke=\"black\" d=\"M79.6,-677.1C79.6,-677.1 44.5,-677.1 44.5,-677.1 38.5,-677.1 32.5,-671.1 32.5,-665.1 32.5,-665.1 32.5,-652.5 32.5,-652.5 32.5,-646.5 38.5,-640.5 44.5,-640.5 44.5,-640.5 79.6,-640.5 79.6,-640.5 85.6,-640.5 91.6,-646.5 91.6,-652.5 91.6,-652.5 91.6,-665.1 91.6,-665.1 91.6,-671.1 85.6,-677.1 79.6,-677.1\"/>\n",
       "<text text-anchor=\"middle\" x=\"62.05\" y=\"-653\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">output</text>\n",
       "</g>\n",
       "<!-- materializer -->\n",
       "<g id=\"node48\" class=\"node\">\n",
       "<title>materializer</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M108.1,-618.34C108.1,-620.37 87.46,-622.01 62.05,-622.01 36.64,-622.01 16,-620.37 16,-618.34 16,-618.34 16,-585.26 16,-585.26 16,-583.23 36.64,-581.59 62.05,-581.59 87.46,-581.59 108.1,-583.23 108.1,-585.26 108.1,-585.26 108.1,-618.34 108.1,-618.34\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M108.1,-618.34C108.1,-616.31 87.46,-614.66 62.05,-614.66 36.64,-614.66 16,-616.31 16,-618.34\"/>\n",
       "<text text-anchor=\"middle\" x=\"62.05\" y=\"-596\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">materializer</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.graphs.Digraph at 0x15ff50d50>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "materializers = [\n",
    "    # materialize the dataframe to a pickle file\n",
    "    to.pickle(\n",
    "        dependencies=output_columns,\n",
    "        id=\"df_to_pickle\",\n",
    "        path=\"./df.pkl\",\n",
    "        combine=df_builder,\n",
    "    ),\n",
    "    # materialize the dataframe to a JSON file\n",
    "    to.json(\n",
    "        dependencies=output_columns,\n",
    "        id=\"df_to_json\",\n",
    "        filepath_or_buffer=\"./df.json\",\n",
    "        combine=df_builder,\n",
    "    ),\n",
    "    to.sql(\n",
    "        dependencies=output_columns,\n",
    "        id=\"df_to_sql\",\n",
    "        table_name=\"test\",\n",
    "        db_connection=conn,\n",
    "        combine=df_builder,\n",
    "    ),\n",
    "    # materialize the dataframe to a XML file\n",
    "    to.xml(\n",
    "        dependencies=output_columns,\n",
    "        id=\"df_to_xml\",\n",
    "        path_or_buffer=\"./df.xml\",\n",
    "        combine=df_builder,\n",
    "    ),\n",
    "    to.html(\n",
    "        dependencies=output_columns,\n",
    "        id=\"df_to_html\",\n",
    "        buf=\"./df.html\",\n",
    "        combine=df_builder,\n",
    "    ),\n",
    "    to.stata(\n",
    "        dependencies=output_columns,\n",
    "        id=\"df_to_stata\",\n",
    "        path=\"./df.dta\",\n",
    "        combine=df_builder,\n",
    "    ),\n",
    "    to.feather(\n",
    "        dependencies=output_columns,\n",
    "        id=\"df_to_feather\",\n",
    "        path=\"./df.feather\",\n",
    "        combine=df_builder,\n",
    "    ),\n",
    "    to.parquet(\n",
    "        dependencies=output_columns,\n",
    "        id=\"df_to_parquet\",\n",
    "        path=\"./df.parquet.gzip\",\n",
    "        combine=df_builder,\n",
    "    ),\n",
    "    to.csv(\n",
    "        dependencies=output_columns,\n",
    "        id=\"df_to_csv\",\n",
    "        path=\"./df.csv\",\n",
    "        combine=df_builder,\n",
    "    ),\n",
    "    to.orc(\n",
    "        dependencies=output_columns,\n",
    "        id=\"df_to_orc\",\n",
    "        path=\"./df.orc\",\n",
    "        combine=df_builder,\n",
    "    ),\n",
    "    to.excel(\n",
    "        dependencies=output_columns,\n",
    "        id=\"df_to_excel\",\n",
    "        path=\"./df.xlsx\",\n",
    "        combine=df_builder,\n",
    "    ),\n",
    "]\n",
    "# Visualize what is happening\n",
    "dr.visualize_materialization(\n",
    "    *materializers,\n",
    "    additional_vars=output_columns,\n",
    "    inputs=initial_columns,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-09-17T05:43:34.026203Z",
     "start_time": "2023-09-17T05:43:34.016610Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "More than one applicable adapter detected for <class 'pandas.core.frame.DataFrame'>. Using the last one registered <class 'hamilton.plugins.pandas_extensions.PandasPickleWriter'>.\n"
     ]
    }
   ],
   "source": [
    "# Materialize a result, i.e. execute the DAG!\n",
    "materialization_results, additional_outputs = dr.materialize(\n",
    "    *materializers,\n",
    "    additional_vars=[\n",
    "        \"df_to_pickle_build_result\",\n",
    "        \"df_to_json_build_result\",\n",
    "        \"df_to_sql_build_result\",\n",
    "        \"df_to_xml_build_result\",\n",
    "        \"df_to_html_build_result\",\n",
    "        \"df_to_stata_build_result\",\n",
    "        \"df_to_feather_build_result\",\n",
    "        \"df_to_parquet_build_result\",\n",
    "        \"df_to_csv_build_result\",\n",
    "        \"df_to_orc_build_result\",\n",
    "        \"df_to_excel_build_result\",\n",
    "    ],  # because combine is used, we can get that result here.\n",
    "    inputs=initial_columns,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-09-17T05:43:34.041466Z",
     "start_time": "2023-09-17T05:43:34.028346Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'df_to_pickle': {'file_metadata': {'size': 1088,\n",
       "   'path': './df.pkl',\n",
       "   'last_modified': 1707261374.0912328,\n",
       "   'timestamp': 1707257774.091604},\n",
       "  'dataframe_metadata': {'rows': 6,\n",
       "   'columns': 5,\n",
       "   'column_names': ['spend',\n",
       "    'signups',\n",
       "    'avg_3wk_spend',\n",
       "    'spend_per_signup',\n",
       "    'spend_zero_mean_unit_variance'],\n",
       "   'datatypes': ['int64', 'int64', 'float64', 'float64', 'float64']}},\n",
       " 'df_to_json': {'file_metadata': {'size': 428,\n",
       "   'path': './df.json',\n",
       "   'last_modified': 1707261374.0931628,\n",
       "   'timestamp': 1707257774.093234},\n",
       "  'dataframe_metadata': {'rows': 6,\n",
       "   'columns': 5,\n",
       "   'column_names': ['spend',\n",
       "    'signups',\n",
       "    'avg_3wk_spend',\n",
       "    'spend_per_signup',\n",
       "    'spend_zero_mean_unit_variance'],\n",
       "   'datatypes': ['int64', 'int64', 'float64', 'float64', 'float64']}},\n",
       " 'df_to_sql': {'sql_metadata': {'rows': 6,\n",
       "   'query': None,\n",
       "   'table_name': 'test',\n",
       "   'timestamp': 1707257774.096384},\n",
       "  'dataframe_metadata': {'rows': 6,\n",
       "   'columns': 5,\n",
       "   'column_names': ['spend',\n",
       "    'signups',\n",
       "    'avg_3wk_spend',\n",
       "    'spend_per_signup',\n",
       "    'spend_zero_mean_unit_variance'],\n",
       "   'datatypes': ['int64', 'int64', 'float64', 'float64', 'float64']}},\n",
       " 'df_to_xml': {'file_metadata': {'size': 1622,\n",
       "   'path': './df.xml',\n",
       "   'last_modified': 1707261374.1253755,\n",
       "   'timestamp': 1707257774.125475},\n",
       "  'dataframe_metadata': {'rows': 6,\n",
       "   'columns': 5,\n",
       "   'column_names': ['spend',\n",
       "    'signups',\n",
       "    'avg_3wk_spend',\n",
       "    'spend_per_signup',\n",
       "    'spend_zero_mean_unit_variance'],\n",
       "   'datatypes': ['int64', 'int64', 'float64', 'float64', 'float64']}},\n",
       " 'df_to_html': {'file_metadata': {'size': 1145,\n",
       "   'path': './df.html',\n",
       "   'last_modified': 1707261374.1274278,\n",
       "   'timestamp': 1707257774.127508},\n",
       "  'dataframe_metadata': {'rows': 6,\n",
       "   'columns': 5,\n",
       "   'column_names': ['spend',\n",
       "    'signups',\n",
       "    'avg_3wk_spend',\n",
       "    'spend_per_signup',\n",
       "    'spend_zero_mean_unit_variance'],\n",
       "   'datatypes': ['int64', 'int64', 'float64', 'float64', 'float64']}},\n",
       " 'df_to_stata': {'file_metadata': {'size': 1526,\n",
       "   'path': './df.dta',\n",
       "   'last_modified': 1707261374.1300728,\n",
       "   'timestamp': 1707257774.13016},\n",
       "  'dataframe_metadata': {'rows': 6,\n",
       "   'columns': 5,\n",
       "   'column_names': ['spend',\n",
       "    'signups',\n",
       "    'avg_3wk_spend',\n",
       "    'spend_per_signup',\n",
       "    'spend_zero_mean_unit_variance'],\n",
       "   'datatypes': ['int64', 'int64', 'float64', 'float64', 'float64']}},\n",
       " 'df_to_feather': {'file_metadata': {'size': 3514,\n",
       "   'path': './df.feather',\n",
       "   'last_modified': 1707261374.1384852,\n",
       "   'timestamp': 1707257774.138582},\n",
       "  'dataframe_metadata': {'rows': 6,\n",
       "   'columns': 5,\n",
       "   'column_names': ['spend',\n",
       "    'signups',\n",
       "    'avg_3wk_spend',\n",
       "    'spend_per_signup',\n",
       "    'spend_zero_mean_unit_variance'],\n",
       "   'datatypes': ['int64', 'int64', 'float64', 'float64', 'float64']}},\n",
       " 'df_to_parquet': {'file_metadata': {'size': 4705,\n",
       "   'path': './df.parquet.gzip',\n",
       "   'last_modified': 1707261374.14694,\n",
       "   'timestamp': 1707257774.147069},\n",
       "  'dataframe_metadata': {'rows': 6,\n",
       "   'columns': 5,\n",
       "   'column_names': ['spend',\n",
       "    'signups',\n",
       "    'avg_3wk_spend',\n",
       "    'spend_per_signup',\n",
       "    'spend_zero_mean_unit_variance'],\n",
       "   'datatypes': ['int64', 'int64', 'float64', 'float64', 'float64']}},\n",
       " 'df_to_csv': {'file_metadata': {'size': 335,\n",
       "   'path': './df.csv',\n",
       "   'last_modified': 1707261374.1481698,\n",
       "   'timestamp': 1707257774.148234},\n",
       "  'dataframe_metadata': {'rows': 6,\n",
       "   'columns': 5,\n",
       "   'column_names': ['spend',\n",
       "    'signups',\n",
       "    'avg_3wk_spend',\n",
       "    'spend_per_signup',\n",
       "    'spend_zero_mean_unit_variance'],\n",
       "   'datatypes': ['int64', 'int64', 'float64', 'float64', 'float64']}},\n",
       " 'df_to_orc': {'file_metadata': {'size': 954,\n",
       "   'path': './df.orc',\n",
       "   'last_modified': 1707261374.153472,\n",
       "   'timestamp': 1707257774.15356},\n",
       "  'dataframe_metadata': {'rows': 6,\n",
       "   'columns': 5,\n",
       "   'column_names': ['spend',\n",
       "    'signups',\n",
       "    'avg_3wk_spend',\n",
       "    'spend_per_signup',\n",
       "    'spend_zero_mean_unit_variance'],\n",
       "   'datatypes': ['int64', 'int64', 'float64', 'float64', 'float64']}},\n",
       " 'df_to_excel': {'file_metadata': {'size': 5218,\n",
       "   'path': './df.xlsx',\n",
       "   'last_modified': 1707261374.2337506,\n",
       "   'timestamp': 1707257774.233816},\n",
       "  'dataframe_metadata': {'rows': 6,\n",
       "   'columns': 5,\n",
       "   'column_names': ['spend',\n",
       "    'signups',\n",
       "    'avg_3wk_spend',\n",
       "    'spend_per_signup',\n",
       "    'spend_zero_mean_unit_variance'],\n",
       "   'datatypes': ['int64', 'int64', 'float64', 'float64', 'float64']}}}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "materialization_results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-09-17T05:43:34.051151Z",
     "start_time": "2023-09-17T05:43:34.043320Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>spend</th>\n",
       "      <th>signups</th>\n",
       "      <th>avg_3wk_spend</th>\n",
       "      <th>spend_per_signup</th>\n",
       "      <th>spend_zero_mean_unit_variance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10.000</td>\n",
       "      <td>-1.064405</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.000</td>\n",
       "      <td>-1.064405</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20</td>\n",
       "      <td>50</td>\n",
       "      <td>13.333333</td>\n",
       "      <td>0.400</td>\n",
       "      <td>-0.483821</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>40</td>\n",
       "      <td>100</td>\n",
       "      <td>23.333333</td>\n",
       "      <td>0.400</td>\n",
       "      <td>0.677349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>40</td>\n",
       "      <td>200</td>\n",
       "      <td>33.333333</td>\n",
       "      <td>0.200</td>\n",
       "      <td>0.677349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>50</td>\n",
       "      <td>400</td>\n",
       "      <td>43.333333</td>\n",
       "      <td>0.125</td>\n",
       "      <td>1.257934</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   spend  signups  avg_3wk_spend  spend_per_signup  \\\n",
       "0     10        1            NaN            10.000   \n",
       "1     10       10            NaN             1.000   \n",
       "2     20       50      13.333333             0.400   \n",
       "3     40      100      23.333333             0.400   \n",
       "4     40      200      33.333333             0.200   \n",
       "5     50      400      43.333333             0.125   \n",
       "\n",
       "   spend_zero_mean_unit_variance  \n",
       "0                      -1.064405  \n",
       "1                      -1.064405  \n",
       "2                      -0.483821  \n",
       "3                       0.677349  \n",
       "4                       0.677349  \n",
       "5                       1.257934  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "additional_outputs[\"df_to_pickle_build_result\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-09-17T05:43:34.058608Z",
     "start_time": "2023-09-17T05:43:34.048662Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>spend</th>\n",
       "      <th>signups</th>\n",
       "      <th>avg_3wk_spend</th>\n",
       "      <th>spend_per_signup</th>\n",
       "      <th>spend_zero_mean_unit_variance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10.000</td>\n",
       "      <td>-1.064405</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.000</td>\n",
       "      <td>-1.064405</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20</td>\n",
       "      <td>50</td>\n",
       "      <td>13.333333</td>\n",
       "      <td>0.400</td>\n",
       "      <td>-0.483821</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>40</td>\n",
       "      <td>100</td>\n",
       "      <td>23.333333</td>\n",
       "      <td>0.400</td>\n",
       "      <td>0.677349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>40</td>\n",
       "      <td>200</td>\n",
       "      <td>33.333333</td>\n",
       "      <td>0.200</td>\n",
       "      <td>0.677349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>50</td>\n",
       "      <td>400</td>\n",
       "      <td>43.333333</td>\n",
       "      <td>0.125</td>\n",
       "      <td>1.257934</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   spend  signups  avg_3wk_spend  spend_per_signup  \\\n",
       "0     10        1            NaN            10.000   \n",
       "1     10       10            NaN             1.000   \n",
       "2     20       50      13.333333             0.400   \n",
       "3     40      100      23.333333             0.400   \n",
       "4     40      200      33.333333             0.200   \n",
       "5     50      400      43.333333             0.125   \n",
       "\n",
       "   spend_zero_mean_unit_variance  \n",
       "0                      -1.064405  \n",
       "1                      -1.064405  \n",
       "2                      -0.483821  \n",
       "3                       0.677349  \n",
       "4                       0.677349  \n",
       "5                       1.257934  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "additional_outputs[\"df_to_json_build_result\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-09-17T05:43:34.089706Z",
     "start_time": "2023-09-17T05:43:34.060251Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   spend  signups  avg_3wk_spend  spend_per_signup  \\\n",
      "0     10        1            NaN            10.000   \n",
      "1     10       10            NaN             1.000   \n",
      "2     20       50      13.333333             0.400   \n",
      "3     40      100      23.333333             0.400   \n",
      "4     40      200      33.333333             0.200   \n",
      "5     50      400      43.333333             0.125   \n",
      "\n",
      "   spend_zero_mean_unit_variance  \n",
      "0                      -1.064405  \n",
      "1                      -1.064405  \n",
      "2                      -0.483821  \n",
      "3                       0.677349  \n",
      "4                       0.677349  \n",
      "5                       1.257934  \n"
     ]
    }
   ],
   "source": [
    "print(additional_outputs[\"df_to_sql_build_result\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   spend  signups  avg_3wk_spend  spend_per_signup  \\\n",
      "0     10        1            NaN            10.000   \n",
      "1     10       10            NaN             1.000   \n",
      "2     20       50      13.333333             0.400   \n",
      "3     40      100      23.333333             0.400   \n",
      "4     40      200      33.333333             0.200   \n",
      "5     50      400      43.333333             0.125   \n",
      "\n",
      "   spend_zero_mean_unit_variance  \n",
      "0                      -1.064405  \n",
      "1                      -1.064405  \n",
      "2                      -0.483821  \n",
      "3                       0.677349  \n",
      "4                       0.677349  \n",
      "5                       1.257934  \n"
     ]
    }
   ],
   "source": [
    "print(additional_outputs[\"df_to_xml_build_result\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   spend  signups  avg_3wk_spend  spend_per_signup  \\\n",
      "0     10        1            NaN            10.000   \n",
      "1     10       10            NaN             1.000   \n",
      "2     20       50      13.333333             0.400   \n",
      "3     40      100      23.333333             0.400   \n",
      "4     40      200      33.333333             0.200   \n",
      "5     50      400      43.333333             0.125   \n",
      "\n",
      "   spend_zero_mean_unit_variance  \n",
      "0                      -1.064405  \n",
      "1                      -1.064405  \n",
      "2                      -0.483821  \n",
      "3                       0.677349  \n",
      "4                       0.677349  \n",
      "5                       1.257934  \n"
     ]
    }
   ],
   "source": [
    "print(additional_outputs[\"df_to_html_build_result\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   spend  signups  avg_3wk_spend  spend_per_signup  \\\n",
      "0     10        1            NaN            10.000   \n",
      "1     10       10            NaN             1.000   \n",
      "2     20       50      13.333333             0.400   \n",
      "3     40      100      23.333333             0.400   \n",
      "4     40      200      33.333333             0.200   \n",
      "5     50      400      43.333333             0.125   \n",
      "\n",
      "   spend_zero_mean_unit_variance  \n",
      "0                      -1.064405  \n",
      "1                      -1.064405  \n",
      "2                      -0.483821  \n",
      "3                       0.677349  \n",
      "4                       0.677349  \n",
      "5                       1.257934  \n"
     ]
    }
   ],
   "source": [
    "print(additional_outputs[\"df_to_stata_build_result\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   spend  signups  avg_3wk_spend  spend_per_signup  \\\n",
      "0     10        1            NaN            10.000   \n",
      "1     10       10            NaN             1.000   \n",
      "2     20       50      13.333333             0.400   \n",
      "3     40      100      23.333333             0.400   \n",
      "4     40      200      33.333333             0.200   \n",
      "5     50      400      43.333333             0.125   \n",
      "\n",
      "   spend_zero_mean_unit_variance  \n",
      "0                      -1.064405  \n",
      "1                      -1.064405  \n",
      "2                      -0.483821  \n",
      "3                       0.677349  \n",
      "4                       0.677349  \n",
      "5                       1.257934  \n"
     ]
    }
   ],
   "source": [
    "print(additional_outputs[\"df_to_feather_build_result\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   spend  signups  avg_3wk_spend  spend_per_signup  \\\n",
      "0     10        1            NaN            10.000   \n",
      "1     10       10            NaN             1.000   \n",
      "2     20       50      13.333333             0.400   \n",
      "3     40      100      23.333333             0.400   \n",
      "4     40      200      33.333333             0.200   \n",
      "5     50      400      43.333333             0.125   \n",
      "\n",
      "   spend_zero_mean_unit_variance  \n",
      "0                      -1.064405  \n",
      "1                      -1.064405  \n",
      "2                      -0.483821  \n",
      "3                       0.677349  \n",
      "4                       0.677349  \n",
      "5                       1.257934  \n"
     ]
    }
   ],
   "source": [
    "print(additional_outputs[\"df_to_parquet_build_result\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   spend  signups  avg_3wk_spend  spend_per_signup  \\\n",
      "0     10        1            NaN            10.000   \n",
      "1     10       10            NaN             1.000   \n",
      "2     20       50      13.333333             0.400   \n",
      "3     40      100      23.333333             0.400   \n",
      "4     40      200      33.333333             0.200   \n",
      "5     50      400      43.333333             0.125   \n",
      "\n",
      "   spend_zero_mean_unit_variance  \n",
      "0                      -1.064405  \n",
      "1                      -1.064405  \n",
      "2                      -0.483821  \n",
      "3                       0.677349  \n",
      "4                       0.677349  \n",
      "5                       1.257934  \n"
     ]
    }
   ],
   "source": [
    "print(additional_outputs[\"df_to_csv_build_result\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   spend  signups  avg_3wk_spend  spend_per_signup  \\\n",
      "0     10        1            NaN            10.000   \n",
      "1     10       10            NaN             1.000   \n",
      "2     20       50      13.333333             0.400   \n",
      "3     40      100      23.333333             0.400   \n",
      "4     40      200      33.333333             0.200   \n",
      "5     50      400      43.333333             0.125   \n",
      "\n",
      "   spend_zero_mean_unit_variance  \n",
      "0                      -1.064405  \n",
      "1                      -1.064405  \n",
      "2                      -0.483821  \n",
      "3                       0.677349  \n",
      "4                       0.677349  \n",
      "5                       1.257934  \n"
     ]
    }
   ],
   "source": [
    "print(additional_outputs[\"df_to_orc_build_result\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>spend</th>\n",
       "      <th>signups</th>\n",
       "      <th>avg_3wk_spend</th>\n",
       "      <th>spend_per_signup</th>\n",
       "      <th>spend_zero_mean_unit_variance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10</td>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10.000</td>\n",
       "      <td>-1.064405</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.000</td>\n",
       "      <td>-1.064405</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20</td>\n",
       "      <td>50</td>\n",
       "      <td>13.333333</td>\n",
       "      <td>0.400</td>\n",
       "      <td>-0.483821</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>40</td>\n",
       "      <td>100</td>\n",
       "      <td>23.333333</td>\n",
       "      <td>0.400</td>\n",
       "      <td>0.677349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>40</td>\n",
       "      <td>200</td>\n",
       "      <td>33.333333</td>\n",
       "      <td>0.200</td>\n",
       "      <td>0.677349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>50</td>\n",
       "      <td>400</td>\n",
       "      <td>43.333333</td>\n",
       "      <td>0.125</td>\n",
       "      <td>1.257934</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   spend  signups  avg_3wk_spend  spend_per_signup  \\\n",
       "0     10        1            NaN            10.000   \n",
       "1     10       10            NaN             1.000   \n",
       "2     20       50      13.333333             0.400   \n",
       "3     40      100      23.333333             0.400   \n",
       "4     40      200      33.333333             0.200   \n",
       "5     50      400      43.333333             0.125   \n",
       "\n",
       "   spend_zero_mean_unit_variance  \n",
       "0                      -1.064405  \n",
       "1                      -1.064405  \n",
       "2                      -0.483821  \n",
       "3                       0.677349  \n",
       "4                       0.677349  \n",
       "5                       1.257934  "
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "additional_outputs[\"df_to_excel_build_result\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-09-17T05:43:34.090208Z",
     "start_time": "2023-09-17T05:43:34.066483Z"
    }
   },
   "outputs": [],
   "source": [
    "# closing out db connection\n",
    "conn.close()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
